package modelo.armas;

import vista.VistaFactory;
import vista.VistaMovil;
import modelo.Movil;
import modelo.naves.Naves;
import modelo.util.ContadorSimple;
import modelo.util.ContadorStopException;

/*
 * esa clase es una clase abstracta la cual al impactar
 * con una nave debe producirle algun danio.
 */
public abstract class Balas extends Movil{

	protected DanioLineal danio;//danio que provoca sobre una nave
	protected boolean estado;// si ha impactado o no alguna nave
	protected ContadorSimple alcance;//cuantas veces puede avanzar.
	protected TipoBala tipoBala;
	
	public Balas(){};
	
	protected Balas (int danio, int alcance){
		this.danio = new DanioLineal(danio);
		this.alcance = new ContadorSimple(alcance);
		this.estado = true;
	}
	
	public boolean activa(){
		return estado;
	}
	
	/*
	 * las balas solo se mueven
	 */
	public Movil actuar() {
		this.mover();
		return null;
	}

	public void chocarConNave (Naves unaNave){
		dispararA (unaNave);
	}
	
	/*
	 * las balas no chocan con los pickUps
	 */
	public void chocarConPickUp(PickUp unPickUp) {
		//nada
	}
	
	public void dispararA(Naves nave){
		//chequeo del danio producido
		int valorDanio = danio.causarDanioSobre(nave.getEnergia());
		//le indica a la nave que danio puede provocarle
		nave.recibirDisparo(valorDanio);
		//se desactiva la bala para indicar que ya ha chocado
		//con una nave y no debe daniar a otras.
		estado = false;
	}

	public int getAlcance (){
		return alcance.getValor();
	}
	
	public int getDanio (){
		return danio.getValor();
	}
	
	public void mover(){
		try {
			alcance.descontar();
		}
		catch (ContadorStopException e){
			throw new AlcanceAgotadoException();
		}
		super.mover();
	}
	
	public boolean seguirActuando(){
		return ((estado) & seguirAvanzando());
	}
	
	public boolean seguirAvanzando(){
		return ( !(alcance.agotado()) );
	}
	
	public void setTipoBala (TipoBala tipoBala){
		this.tipoBala = tipoBala;
	}
	
	public VistaMovil getVista (VistaFactory vistaFactory){
		
		return (tipoBala.getVista(this, vistaFactory));
	}
	
	
}
